/**
 * @param {character[][]} matrix
 * @return {number}
 */
/* 
方法思路
预处理：如果输入矩阵为空或长度为 0，直接返回 0。
动态规划数组：创建一个与输入矩阵大小相同的二维数组dp，其中dp[i][j]表示以位置(i, j)为右下角的最大正方形的边长。
初始化：将第一行和第一列的值直接复制到dp数组中，因为这些位置的最大正方形边长只能是 1 或 0。
状态转移方程：对于其他位置(i, j)，如果矩阵中该位置的值为 '1'，则dp[i][j]的值为其上方、左方和左上方三个位置的dp值的最小值加 1；否则为 0。
记录最大边长：在填充dp数组的过程中，记录遇到的最大边长。
计算面积：最大正方形的面积为最大边长的平方。

代码解释
预处理：检查输入矩阵是否为空，若为空则直接返回 0。
初始化 DP 数组：创建一个与输入矩阵大小相同的二维数组dp，并初始化最大边长maxSide为 0。
处理第一行和第一列：将第一行和第一列的值直接复制到dp数组中，并更新最大边长。
填充 DP 数组：遍历剩余的位置，根据状态转移方程计算每个位置的dp值，并更新最大边长。
计算面积：返回最大边长的平方作为结果。
*/
var maximalSquare = function (matrix) {
  if (matrix.length === 0) return 0;

  const m = matrix.length;
  const n = matrix[0].length;
  const dp = Array.from({ length: m }, () => Array(n).fill(0));

  let maxSide = 0;

  // 初始化第一行和第一列
  for (let i = 0; i < m; i++) {
    dp[i][0] = parseInt(matrix[i][0]);
    maxSide = Math.max(maxSide, dp[i][0]);
  }

  for (let j = 0; j < n; j++) {
    dp[0][j] = parseInt(matrix[0][j]);
    maxSide = Math.max(maxSide, dp[0][j]);
  }

  // 填充剩余的dp数组
  for (let i = 1; i < m; i++) {
    for (let j = 1; j < n; j++) {
      if (matrix[i][j] === '1') {
        dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1;
        maxSide = Math.max(maxSide, dp[i][j]);
      } else {
        dp[i][j] = 0;
      }
    }
  }

  return maxSide * maxSide;
};